# -*- coding: iso-8859-15 -*-
#importamos las librerias de pygame
import pygame, os
from pygame.locals import *
#definimos dos constantes para la resolucion de la pantalla
PANTALLA_ALTURA = 600
PANTALLA_ANCHURA = 800


#CARGA UNA IMAGEN 
def load_image(name, colorkey = False):
    try: image = pygame.image.load(name)
    except pygame.error, message:
            print 'No se puede cargar la imagen: ', name
            raise SystemExit, message
    
    if(colorkey):
        colorkey = image.get_at((0,0))
        image.set_colorkey(colorkey, RLEACCEL)
    return image, image.get_rect()

#CARGAMOS IMAGENES DE BLOQUES
def cargar_imagenes_de_bloques():
    #Devuelve una lista de superficies con los bloques
    bloques = []
    for n in range(7):
        bloques.append(pygame.image.load('/media/datos/juegoPython/tanques/bloques/%d.png' %n).convert_alpha())

    return bloques
    
#DIBUJAMOS LOS BLOQUES EN LA PANTALLA
def dibujar_bloques(superficie, contenido):

    bloques = cargar_imagenes_de_bloques()
    numero_de_filas = len(contenido)
    numero_de_columnas = len(contenido[0]) - 1 # -1 por el salto de linea
    superficie.fill((0, 0, 0))
    for fila in range(numero_de_filas):
        for columna in range(numero_de_columnas):
            indice = int(contenido[fila][columna])
            pos_x = columna * 30 + 15
            pos_y = fila * 30 + 15
            superficie.blit(bloques[indice], (pos_x, pos_y))
    return contenido


#DECIDIMOS EN LOS BLOQUES QUE PUEDE PISAR EL PERSONAJE
def puede_pisar(x, y, contenido):
    #para depurar
    #import pdb
    #pdb.set_trace()
    fila = y/30
    columna = x/30
        
    try:
        celda = int(contenido[fila][columna])
    except:
        # si no puede obtener la celda prohibe pisar ahí
        return False
    if celda in [3,5]:
        return True
    return False


#creamos un grupo
from pygame.sprite import Group
GOOD = Group()
EVIL = Group()

#TANKES PROPIOS
class tanque (pygame.sprite.Sprite):
    def __init__(self):
        #llama al constructor padre
        pygame.sprite.Sprite.__init__(self)
        #tanke1
        self.imageF, self.rect = load_image("tankeF.png")
        self.imageF1, self.rect = load_image("tankeF1.png") 
        self.imageE = pygame.transform.rotate(self.imageF, + 180) 
        self.imageI = pygame.transform.rotate(self.imageF, + 90) 
        self.imageD = pygame.transform.rotate(self.imageF, + 270) 
        self.imageD1 = pygame.transform.rotate(self.imageF1, +270)
        self.imageI1 = pygame.transform.rotate(self.imageF1, + 90)
        self.imageE1 = pygame.transform.rotate(self.imageF1, + 180)
        #tanke2
        self.imageF2, self.rect = load_image("2tankeF.png")
        self.imageF12, self.rect = load_image("2tankeF1.png")
        self.imageE2 = pygame.transform.rotate(self.imageF2, + 180)
        self.imageI2 = pygame.transform.rotate(self.imageF2, + 90)
        self.imageD2 = pygame.transform.rotate(self.imageF2, + 270)
        self.imageD12 = pygame.transform.rotate(self.imageF12, +270)
        self.imageI12 = pygame.transform.rotate(self.imageF12, + 90)
        self.imageE12 = pygame.transform.rotate(self.imageF12, + 180)
        # atributo direccion
        # seria parado, arriba, abajo, izquierda, derecha
        self.direccion = 'parado'
        
#CLASE DISPARO
class disparo (pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.imageDisparo, self.rect = load_image('disparo.png')
        
       
#CLASE PRINCIPAL
def main():
    pygame.init()
    screen = pygame.display.set_mode( (PANTALLA_ANCHURA, PANTALLA_ALTURA) ) #creamos una ventana del tamaño que queremos
    pygame.display.set_caption( "TANK" ) #ponemos nombre en la ventana
    #cargamos mapa de bloques y lo guardamos en contenido
    archivo = file('nivel1.txt', 'rt')
    contenido = archivo.readlines()
    archivo.close()
    #cargamos los bloques de fondo
    fondo1 = dibujar_bloques(screen, contenido)
    pygame.display.flip()
    #creamos dos tanques
    tanque1 = tanque()
    tanque2 = tanque()
    GOOD.add([tanque1]) #añadimos el tanque1 a un grupo
    #posicion inicial de los tanques
    tanque1.centerx = 225
    tanque1.centery = 555   
    tanque2.centerx = 345 
    tanque2.centery = 555
    tanque1.center = (tanque1.centerx, tanque1.centery)
    tanque2.center = (tanque2.centerx, tanque2.centery)
    #blit se usa para dibujar en pantalla. recibe superficie a imprimir y su posicion(x,y)
    #screen.blit(fondo, (0,0))
    screen.blit(tanque1.imageF2, (tanque1.centerx,tanque1.centery))
    screen.blit(tanque2.imageF, (tanque2.centerx,tanque2.centery))
    pygame.mouse.set_visible(True) #mostrar ocultar raton
    pygame.display.flip() #mostrarlo todo
    
    #variables para las colisiones    
    cont = -1
    p = 0

#EL GRAN MAESTRO WHILE
    while 1:    
       
        for event in pygame.event.get():
            if event.type == KEYDOWN and event.key in eventos1.keys():
                tanque1.direccion = eventos1[event.key]
            if event.type == KEYDOWN and event.key in eventos2.keys():
                tanque2.direccion = eventos2[event.key]
            if event.type == KEYUP and event.key in eventos2.keys() and tanque2.direccion == eventos2[event.key]:
                tanque2.direccion = 'parado'
            if event.type == KEYUP and event.key in eventos1.keys() and tanque1.direccion == eventos1[event.key]:
                tanque1.direccion = 'parado'

#TANQUE 1 AZUL
        # diccionario de eventos del tanque1
        eventos1 = {K_w: 'arriba1', K_s: 'abajo1',\
         K_a: 'izquierda1', K_d: 'derecha1'}
        if tanque1.direccion == 'arriba1':        
            tanque1.center = (tanque1.centerx, tanque1.centery-1)
            tanque1.centery = tanque1.centery - 1
            p = "up1"
        if tanque1.direccion == 'abajo1':
            tanque1.center = (tanque1.centerx, tanque1.centery+1)
            tanque1.centery = tanque1.centery+1
            p = "down1"
        if tanque1.direccion == 'izquierda1':
            tanque1.center = (tanque1.centerx-1, tanque1.centery)
            tanque1.centerx = tanque1.centerx-1
            p = "left1";
        if tanque1.direccion == 'derecha1':
            tanque1.center = (tanque1.centerx+1, tanque1.centery)
            tanque1.centerx = tanque1.centerx+1
            p = "right1";
        #intentar que el tanque dispare AHI QUE HACER UPDATE Y PONERSELO A DISPARO CON VELOCIDAD TB KILL CUANDO SALGA DE LOS LIMITES
        disparo1 = disparo()
        pygame.event.pump()
        keyinput = pygame.key.get_pressed()        
        if keyinput[K_e]:
            disparo1.rect.centerx = tanque1.centerx
            disparo1.rect.centery = tanque1.centery
            tiro = screen.blit(disparo1.imageDisparo, (disparo1.rect.centerx, disparo1.rect.centery))
            while disparo1.rect.centerx < 600: #jajajaja para partirse como va el tiro 
                disparo1.rect.centerx = disparo1.rect.centerx + 5
                #print dx1,dy1
                screen.blit(disparo1.imageDisparo, (disparo1.rect.centerx, disparo1.rect.centery))
                pygame.display.flip()
                dibujar_bloques(screen, contenido)

        # Choque con los bloques, tanque1
        if not puede_pisar(tanque1.centerx+15, tanque1.centery, contenido):
            tanque1.centerx = tanque1.centerx-1
        if not puede_pisar(tanque1.centerx, tanque1.centery + 15, contenido):
            tanque1.centery = tanque1.centery-1
        if not puede_pisar(tanque1.centerx -15, tanque1.centery, contenido):
            tanque1.centerx = tanque1.centerx+1
        if not puede_pisar(tanque1.centerx, tanque1.centery - 15, contenido):
            tanque1.centery = tanque1.centery+1  
        
        #hacer gif con imagenes :P
        screen.blit(tanque1.imageF2, (tanque1.center))
        tanque1.rect.center = (tanque1.center)
        if p == "up1":
            if (tanque1.centery % 2) == 0: screen.blit(tanque1.imageF2, (tanque1.center))
            else: screen.blit(tanque1.imageF12, (tanque1.center))
        elif p == "down1":
            if (tanque1.centery % 2) == 0: screen.blit(tanque1.imageE2, (tanque1.center))
            else: screen.blit(tanque1.imageE12, (tanque1.center))
        elif p == "left1":
            if (tanque1.centerx % 2) == 0: screen.blit(tanque1.imageI2, (tanque1.center))
            else: screen.blit(tanque1.imageI12, (tanque1.center))
        elif p == "right1":
            if (tanque1.centerx % 2) == 0: screen.blit(tanque1.imageD2, (tanque1.center))
            else: screen.blit(tanque1.imageD12, (tanque1.center))           

#TANKE 2 AMARILLO
        # diccionario de eventos del tanque2
        eventos2 = {K_UP: 'arriba2', K_DOWN: 'abajo2',\
         K_LEFT: 'izquierda2', K_RIGHT: 'derecha2'}                
        #print tanque2.direccion
        if tanque2.direccion == 'arriba2':
            tanque2.center = (tanque2.centerx, tanque2.centery-1)
            tanque2.centery = tanque2.centery-1
            p = "up"
        if tanque2.direccion == 'abajo2':
            tanque2.center = (tanque2.centerx, tanque2.centery+1)
            tanque2.centery = tanque2.centery+1
            p = "down"
        if tanque2.direccion == 'izquierda2':
            tanque2.center = (tanque2.centerx-1, tanque2.centery)
            tanque2.centerx = tanque2.centerx-1
            p = "left"
        if tanque2.direccion == 'derecha2':
            tanque2.center = (tanque2.centerx+1, tanque2.centery)
            tanque2.centerx = tanque2.centerx+1
            p = "right"

        # Choque con los bloques, tanque2
        if not puede_pisar(tanque2.centerx +15, tanque2.centery, contenido):
            tanque2.centerx = tanque2.centerx-1
        if not puede_pisar(tanque2.centerx, tanque2.centery + 15, contenido):
            tanque2.centery = tanque2.centery-1
        if not puede_pisar(tanque2.centerx -15, tanque2.centery, contenido):
            tanque2.centerx = tanque2.centerx+1
        if not puede_pisar(tanque2.centerx, tanque2.centery - 15, contenido):
            tanque2.centery = tanque2.centery+1
        
        #hacer gif :P
        screen.blit(tanque2.imageF, (tanque2.center))
        tanque2.rect.center = (tanque2.center)
        if p == "up":
            if (tanque2.centery % 2) == 0: screen.blit(tanque2.imageF, (tanque2.center))
            else: screen.blit(tanque2.imageF1, (tanque2.center))
        elif p == "down":
            if (tanque2.centery % 2) == 0: screen.blit(tanque2.imageE, (tanque2.center))
            else: screen.blit(tanque2.imageE1, (tanque2.center))
        elif p == "left":
            if (tanque2.centerx % 2) == 0: screen.blit(tanque2.imageI, (tanque2.center))
            else: screen.blit(tanque2.imageI1, (tanque2.center))
        elif p == "right":
            if (tanque2.centerx % 2) == 0: screen.blit(tanque2.imageD, (tanque2.center))
            else: screen.blit(tanque2.imageD1, (tanque2.center))           
        
        #salir con el boton Esc        
        pygame.event.pump()
        keyinput = pygame.key.get_pressed()        
        if keyinput[K_ESCAPE] or pygame.event.peek(QUIT): raise SystemExit

        #colision entre tanque y un grupo    
        colision = pygame.sprite.spritecollideany(tanque2, GOOD)
        if colision:
            cont = cont + 1
            #print ('Ha colisionado',cont, 'veces')
            '''
            HACER QUE LOS TANQUES COLISIONEN
            xx = tanque1.centerx - tanque2.centerx
            yy = tanque1.centery - tanque2.centery
            if xx > 0:
                tanque1.centerx = tanque1.centerx - 2
                tanque2.centerx = tanque2.centerx + 2
            else:
                tanque1.centerx = tanque1.centerx + 2
                tanque2.centerx = tanque2.centerx - 2
            if yy > 0: 
                tanque1.centery = tanque1.centery - 2 
                tanque2.centery = tanque2.centery + 2
            else:
                tanque1.centery = tanque1.centery + 2
                tanque2.centery = tanque2.centery - 2
            '''
            
        #hacer que el tanque no se salga de los limites de la pantalla
        if tanque1.centerx < 15:     tanque1.centerx = 15
        if tanque1.centerx > 555:    tanque1.centerx = 555
        if tanque1.centery < 15:     tanque1.centery = 15
        if tanque1.centery > 555:    tanque1.centery = 555
        
        if tanque2.centerx < 15:     tanque2.centerx = 15
        if tanque2.centerx > 555:    tanque2.centerx = 555
        if tanque2.centery < 15:     tanque2.centery = 15
        if tanque2.centery > 555:    tanque2.centery = 555
        

        #refrescar        
        pygame.display.flip()
        dibujar_bloques(screen, contenido)
        

#Esta linea lanza la funcion principal si aun no esta lanzada
if __name__ == '__main__': main()
